Enlace al repositorio

GitHub

Introducción

La diabetes es una enfermedad crónica que afecta a millones de personas en todo el mundo y que representa un desafío creciente para los sistemas de salud. Las complicaciones asociadas con la diabetes, como enfermedades cardiovasculares, nefropatías y neuropatías, pueden aumentar significativamente la necesidad de hospitalización. Además, diversos estudios han sugerido que factores ambientales, incluyendo las variaciones climáticas, podrían desempeñar un papel importante en la exacerbación de síntomas y el desarrollo de complicaciones en personas con diabetes.

A pesar de estos indicios, aún existe una considerable falta de conocimiento sobre cómo las condiciones climáticas específicas, como la temperatura, la humedad, o las precipitaciones, pueden influir en la salud de las personas diabéticas y en los patrones de hospitalización. En particular, no se ha explorado suficientemente si existen correlaciones consistentes entre variables climáticas y las tasas de hospitalización. Este vacío de conocimiento es especialmente relevante en el contexto de un clima cambiante que podría exacerbar estas tendencias.

Con este seminario, buscamos abordar estas lagunas mediante un enfoque interdisciplinario que integre datos climáticos históricos y registros de hospitalización para analizar posibles relaciones entre estas variables y aportar al entendimiento de los factores ambientales que afectan a las personas con diabetes.

Objetivo General

Explorar y analizar la relación entre las hospitalizaciones por diabetes y las variaciones en las condiciones climáticas (como temperatura, humedad y precipitaciones), con el fin de identificar patrones y posibles correlaciones que contribuyan al conocimiento de los factores ambientales que influyen en esta enfermedad.

Objetivos Específicos

  1. Analizar la relación entre las variables climáticas clave (temperatura máxima, mínima y media) y las tasas de hospitalizaciones y muertes por diabetes.

  2. Identificar posibles correlaciones entre las variaciones climáticas y las tasas de hospitalización, explorando la fuerza y dirección de dichas relaciones.

  3. Determinar si existen diferencias significativas en el impacto de las condiciones climáticas sobre las hospitalizaciones por diabetes en distintas regiones geográficas.

Artículos relacionados

Artículo 1

El artículo de Preston et al. (2020) realiza una revisión sistemática sobre la relación entre factores climáticos (temperatura ambiente, estacionalidad y humedad) y la diabetes gestacional (GDM) (Preston et al. 2020). Se identificaron 16 artículos que analizan estas asociaciones, mostrando evidencia consistente de un efecto estacional, con mayores tasas de GDM y niveles de glucosa más elevados durante el verano. También se encontró evidencia sugestiva de que temperaturas más altas podrían estar asociadas con niveles elevados de glucosa en embarazadas. A pesar de las inconsistencias metodológicas en los estudios, los resultados destacan la necesidad de investigaciones adicionales para comprender los mecanismos detrás de estas asociaciones.

Artículo 2

El artículo de Moon (2021) analiza mediante un meta-análisis cómo las olas de calor afectan la morbilidad y mortalidad en pacientes con diabetes (Moon 2021). A partir de 36 estudios, se encontró que las olas de calor incrementan ligeramente los riesgos de mortalidad (18 %) y morbilidad (10 %) en esta población. También se identificaron factores importantes como los días de desfase (“lag days”) y la definición de ola de calor. Aunque el artículo no aborda directamente las hospitalizaciones, sus hallazgos son relevantes al explorar cómo los extremos climáticos pueden agravar las condiciones de salud en diabéticos, destacando la importancia de estrategias de salud pública para mitigar estos efectos.

Ejecuciones

1. Carga de paquetes

A continuación se recogen todos los paquetes utilizados para el tratamiento de los detos de trabajo.

Para obtener los datos meteorológicos necesarios, se utilizó el paquete climaemet (Emet 2024). Para extraer los datos relativos a hospitalizaciones la fuente de el INE(Instituto Nacional de Estadística (INE) 2024).

library(pxR)
library(climaemet)
library(dplyr)
library(stringr)
library(shiny)
library(ggplot2)
library(plotly)
library(tidyr)
library(mapSpain)
library(countrycode)
library(sf)
library(DT)
library(readr)

## Use this function to register your API Key temporarly or permanently
# aemet_api_key("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJmcGFibG81NDVAZ21haWwuY29tIiwianRpIjoiYTI2NWIyNzQtY2M4OS00NWZmLThlNGYtMWJlYWQ2NTA1MTAxIiwiaXNzIjoiQUVNRVQiLCJpYXQiOjE3MjkzNTMxNTgsInVzZXJJZCI6ImEyNjViMjc0LWNjODktNDVmZi04ZTRmLTFiZWFkNjUwNTEwMSIsInJvbGUiOiIifQ.TGFw-QlkAkMyQ2hItIpbSF_xDIoN42JpIzUhf-dOm3A", install= TRUE)

2. Obtención datos diabetes

2.1. Ingresos

Obtenemos los nombres de archivos con datos de diabetes

archivos <- list.files('INPUT/DATA/Diabetes/Ingresos/', pattern = '*.px')

Añadimos la ruta completa de cada archivo

archivos_pc <- sapply(archivos, function(x) paste0('INPUT/DATA/Diabetes/Ingresos/', x))

Creamos el dataframe base con el primer archivo, que servirá para concatenar los datos de años siguientes

df_i <- data.frame(as.data.frame(read.px(archivos_pc[1])))
df_i['Año'] <- 1997  # Añadir columna de año

Bucle para añadir cada año al dataframe

for (i in 2:length(archivos_pc)) {
  # Cargar los datos del año específico
  df_provisional <- data.frame(as.data.frame(read.px(archivos_pc[i])))
  
  # Extraer el año del nombre del archivo
  año <- unlist(strsplit(archivos[i], "\\."))[1]
  año <- substr(año, nchar(año) - 3, nchar(año))
  
  # Añadir columna de año al nuevo dataframe
  df_provisional['Año'] <- año
  
  # Asegurar que las columnas coincidan
  colnames(df_provisional) <- colnames(df_i)
  
  # Concatenar el dataframe con el del año anterior
  df_i <- rbind(df_i, df_provisional)
}

Tras la carga de datos, el dataframe queda así:

2.1.1. Código para limpiar y estandarizar valores de atributos.

Primero eliminamos el atributo ‘Diagnóstico’

df_i <- select(df_i,-Diagnóstico)
  • Provincias

Si analizamos los distintos valores que toma el atributo ‘Provincia.de.hospitalización’ observamos que supera la suma de provincias (50), ciudades autónomas (2), comunidades autónomas no uniprovinciales (10) y país (1).

length(levels(df_i$Provincia.de.hospitalización))
## [1] 154

Limpiamos los nombres de las provincias: eliminamos números y ajustamos algunos nombres para normalización.

df_i$Provincia.de.hospitalización <- str_replace_all(df_i$Provincia.de.hospitalización,"[0123456789]","") %>% 
  str_replace_all("^ ","") %>% 
  str_replace_all("Araba/Á","A") %>% 
  str_replace_all("/Alacant", '') %>% 
  str_replace_all("ANDALUCÍA", 'Andalucía') %>% 
  str_replace_all('ARAGÓN', 'Aragón') %>% 
  str_replace_all('ASTURIAS','Asturias') %>% 
  str_replace_all('Asturias \\(Principado de\\)', 'Asturias') %>%
  str_replace_all('Asturias, Principado de', 'Asturias') %>%  
  str_replace_all('Asturias, PRINCIPADO DE', 'Asturias') %>%
  str_replace_all('Ávila', 'Avila') %>% 
  str_replace_all('BALEARS, ILLES', 'Baleares') %>% 
  str_replace_all('Balears, Illes', 'Baleares') %>% 
  str_replace_all('Balears \\(Illes\\)', 'Baleares') %>% 
  str_replace_all("CANARIAS", 'Canarias') %>% 
  str_replace_all("CANTABRIA", 'Cantabria') %>% 
  str_replace_all("Castellón de la Plana", 'Castellón') %>% 
  str_replace_all("/Castelló", '') %>% 
  str_replace_all("CASTILLA - LA MANCHA", 'Castilla - La Mancha') %>% 
  str_replace_all("CASTILLA Y LEÓN", 'Castilla y León') %>% 
  str_replace_all("CATALUÑA", 'Cataluña') %>% 
  str_replace_all("Comunitat Valenciana", 'Comunidad Valenciana') %>% 
  str_replace_all("COMUNITAT VALENCIANA", 'Comunidad Valenciana') %>% 
  str_replace_all("Coruña \\(A\\)", 'A Coruña') %>% 
  str_replace_all("Coruña, A", 'A Coruña') %>% 
  str_replace_all("EXTREMADURA", 'Extremadura') %>% 
  str_replace_all("GALICIA", 'Galicia') %>% 
  str_replace_all("Guipúzcoa", 'Gipuzkoa') %>% 
  str_replace_all('MADRID, COMUNIDAD DE','Madrid') %>% 
  str_replace_all('Madrid, Comunidad de', 'Madrid') %>%
  str_replace_all('Madrid \\(Comunidad de\\)', 'Madrid') %>% 
  str_replace_all('MURCIA, REGIÓN DE','Murcia') %>% 
  str_replace_all('Murcia \\(Región de\\)','Murcia') %>%
  str_replace_all('Murcia, Región de','Murcia') %>%
  str_replace_all('Murcia*', 'Murcia') %>% 
  str_replace_all('NAVARRA, COMUNIDAD FORAL DE','Navarra') %>% 
  str_replace_all('Navarra \\(Comun. Foral de\\)', 'Navarra') %>%
  str_replace_all('Navarra, Comunidad Foral de', 'Navarra') %>% 
  str_replace_all('PAÍS VASCO', 'País Vasco') %>% 
  str_replace_all("Palmas \\(Las\\)", 'Las Palmas') %>% 
  str_replace_all("Palmas, Las", 'Las Palmas') %>%
  str_replace_all("Rioja \\(La\\)", 'La Rioja') %>%
  str_replace_all("Rioja, La", 'La Rioja') %>%
  str_replace_all("RIOJA, LA", 'La Rioja') %>% 
  str_replace_all("TOTAL NACIONAL", 'Total') %>% 
  str_replace_all("Total Nacional", 'Total') %>% 
  str_replace_all("/València", '') %>% 
  str_replace_all("Bizkaia", 'Vizcaya')

Comprobamos de nuevo el número de distintos valores en ‘Provincia.de.hospitalización’.

length(levels(factor(df_i$Provincia.de.hospitalización)))
## [1] 63
  • Sexo

Se han registrado el sexo de los individuos masculinos como “Varón” o “Hombres”

levels(factor(df_i$Sexo))
## [1] "Varones"     "Mujeres"     "Ambos sexos" "Hombres"

Se modifica de tal manera de que solo se registren como “Hombres”

df_i$Sexo <- str_replace_all(df_i$Sexo,"Varones", 'Hombres')
levels(factor(df_i$Sexo))
## [1] "Ambos sexos" "Hombres"     "Mujeres"
2.1.2. Código para añadir como atributo la comunidad autónoma.

Se añade la información refenrente a la comunidad autónoma como un nuevo atributo y se eliminan los registros que aglutinan los datos de las comunidades no uniprovinciales y el total nacional.`

df_i<- df_i %>% 
  mutate(Comunidad.Autonoma = case_when(
    Provincia.de.hospitalización %in% c("Almería","Cádiz","Córdoba","Granada","Huelva","Jaén","Málaga","Sevilla") ~ "Andalucía",
    Provincia.de.hospitalización %in% c("Huesca","Teruel","Zaragoza") ~ "Aragón",
    Provincia.de.hospitalización == "Baleares" ~ "Baleares",
    Provincia.de.hospitalización == "Asturias" ~ "Asturias",
    Provincia.de.hospitalización %in% c("Las Palmas","Santa Cruz de Tenerife") ~ "Canarias",
    Provincia.de.hospitalización == "Cantabria" ~ "Cantabria",
    Provincia.de.hospitalización %in% c("Avila","Burgos", "León", "Palencia", "Salamanca", "Segovia", "Soria", "Valladolid", "Zamora") ~ "Castilla y León",
    Provincia.de.hospitalización %in% c("Albacete", "Ciudad Real", "Cuenca", "Guadalajara", "Toledo") ~ "Castilla - La Mancha",
    Provincia.de.hospitalización %in% c("Barcelona", "Girona", "Lleida", "Tarragona") ~ "Cataluña",
    Provincia.de.hospitalización %in% c("Alicante", "Castellón", "Valencia") ~ "Comunidad Valenciana",
    Provincia.de.hospitalización %in% c("Badajoz", "Cáceres") ~ "Extremadura",
    Provincia.de.hospitalización %in% c("A Coruña", "Lugo", "Ourense", "Pontevedra") ~ "Galicia", 
    Provincia.de.hospitalización == "Madrid" ~ "Madrid",
    Provincia.de.hospitalización == "Murcia" ~ "Murcia",
    Provincia.de.hospitalización == "Navarra" ~ "Navarra",
    Provincia.de.hospitalización %in% c("Alava", "Gipuzkoa", "Vizcaya") ~ "País Vasco",
    Provincia.de.hospitalización == "La Rioja" ~ "La Rioja",
    Provincia.de.hospitalización == "Ceuta" ~ "Ceuta",
    Provincia.de.hospitalización == "Melilla" ~ "Melilla"
  )) %>% 
  filter(!grepl("^(Total|Andalucía|Aragón|Canarias|Castilla y León|Castilla - La Mancha|Cataluña|Comunidad Valenciana|Extremadura|Galicia|País Vasco)"
                , Provincia.de.hospitalización)) 
  • Renombrado de atributos
df_i <- rename(.data = df_i, Provincia = Provincia.de.hospitalización, Diagnosticos = value)
2.1.3. Estructura final de los datos

2.2. Muertes

datos_muertes <- read.px('INPUT/DATA/Diabetes/Muertes/muertes1997-2022.px')
df_m <- as.data.frame(datos_muertes)

Mostramos las primeras filas del dataframe para verificar la carga de datos.

2.2.1. Código para limpiar y estandarizar valores de atributos.`

Realizamos los mismos cambios que con los datos de muertes por diabetes.

  • Eliminamos el atributo ‘Causa.de.muerte’
df_m <- select(df_m,-Causa.de.muerte)
  • Provincias

Estandarizamos los nombres de las provincias.

df_m$Provincias <- str_replace_all(df_m$Provincias,"[0123456789]","") %>% 
  str_replace_all("^ ","") %>% 
  str_replace_all("Araba/Á","A") %>% 
  str_replace_all("/Alacant", '') %>% 
  str_replace_all("ANDALUCÍA", 'Andalucía') %>% 
  str_replace_all('ARAGÓN', 'Aragón') %>% 
  str_replace_all('ASTURIAS','Asturias') %>% 
  str_replace_all('Asturias \\(Principado de\\)', 'Asturias') %>%
  str_replace_all('Asturias, Principado de', 'Asturias') %>%  
  str_replace_all('Asturias, PRINCIPADO DE', 'Asturias') %>%
  str_replace_all('Ávila', 'Avila') %>% 
  str_replace_all('BALEARS, ILLES', 'Baleares') %>% 
  str_replace_all('Balears, Illes', 'Baleares') %>% 
  str_replace_all('Balears \\(Illes\\)', 'Baleares') %>% 
  str_replace_all("CANARIAS", 'Canarias') %>% 
  str_replace_all("CANTABRIA", 'Cantabria') %>% 
  str_replace_all("Castellón de la Plana", 'Castellón') %>% 
  str_replace_all("/Castelló", '') %>% 
  str_replace_all("CASTILLA - LA MANCHA", 'Castilla - La Mancha') %>% 
  str_replace_all("CASTILLA Y LEÓN", 'Castilla y León') %>% 
  str_replace_all("CATALUÑA", 'Cataluña') %>% 
  str_replace_all("Comunitat Valenciana", 'Comunidad Valenciana') %>% 
  str_replace_all("COMUNITAT VALENCIANA", 'Comunidad Valenciana') %>% 
  str_replace_all("Coruña \\(A\\)", 'A Coruña') %>% 
  str_replace_all("Coruña, A", 'A Coruña') %>% 
  str_replace_all("EXTREMADURA", 'Extremadura') %>% 
  str_replace_all("GALICIA", 'Galicia') %>% 
  str_replace_all("Guipúzcoa", 'Gipuzkoa') %>% 
  str_replace_all('MADRID, COMUNIDAD DE','Madrid') %>% 
  str_replace_all('Madrid, Comunidad de', 'Madrid') %>%
  str_replace_all('Madrid \\(Comunidad de\\)', 'Madrid') %>% 
  str_replace_all('MURCIA, REGIÓN DE','Murcia') %>% 
  str_replace_all('Murcia \\(Región de\\)','Murcia') %>%
  str_replace_all('Murcia, Región de','Murcia') %>%
  str_replace_all('Murcia*', 'Murcia') %>% 
  str_replace_all('NAVARRA, COMUNIDAD FORAL DE','Navarra') %>% 
  str_replace_all('Navarra \\(Comun. Foral de\\)', 'Navarra') %>%
  str_replace_all('Navarra, Comunidad Foral de', 'Navarra') %>% 
  str_replace_all('PAÍS VASCO', 'País Vasco') %>% 
  str_replace_all("Palmas \\(Las\\)", 'Las Palmas') %>% 
  str_replace_all("Palmas, Las", 'Las Palmas') %>%
  str_replace_all("Rioja \\(La\\)", 'La Rioja') %>% 
  str_replace_all("Rioja, La", 'La Rioja') %>%
  str_replace_all("RIOJA, LA", 'La Rioja') %>% 
  str_replace_all("TOTAL NACIONAL", 'Total') %>% 
  str_replace_all("Total Nacional", 'Total') %>% 
  str_replace_all("/València", '') %>% 
  str_replace_all("Bizkaia", 'Vizcaya')
  • Sexo

Se modifica el valor “Ambos sexos” por “Total” para que el atributo sexo comparta los mismos niveles en los dataframes de ingresos y muertes.

levels(factor(df_m$Sexo))
## [1] "Total"   "Hombres" "Mujeres"
df_m$Sexo <-  str_replace_all(df_m$Sexo,"Total","Ambos sexos")
levels(factor(df_m$Sexo))
## [1] "Ambos sexos" "Hombres"     "Mujeres"
2.2.2. Código para añadir como atributo la comunidad autónoma.

De igual manera que con los datos de ingresos, se añade la información referente a la comunidad autónoma como un nuevo atributo y se eliminan los registros que aglutinan los datos de las comunidades no uniprovinciales y el total nacional.

df_m <- df_m %>%
  mutate(Comunidad.Autonoma = case_when(
    Provincias %in% c("Almería","Cádiz","Córdoba","Granada","Huelva","Jaén","Málaga","Sevilla") ~ "Andalucía",
    Provincias %in% c("Huesca","Teruel","Zaragoza") ~ "Aragón",
    Provincias == "Baleares" ~ "Baleares",
    Provincias == "Asturias" ~ "Asturias",
    Provincias %in% c("Las Palmas","Santa Cruz de Tenerife") ~ "Canarias",
    Provincias == "Cantabria" ~ "Cantabria",
    Provincias %in% c("Avila","Burgos", "León", "Palencia", "Salamanca", "Segovia", "Soria", "Valladolid", "Zamora") ~ "Castilla y León",
    Provincias %in% c("Albacete", "Ciudad Real", "Cuenca", "Guadalajara", "Toledo") ~ "Castilla - La Mancha",
    Provincias %in% c("Barcelona", "Girona", "Lleida", "Tarragona") ~ "Cataluña",
    Provincias %in% c("Alicante", "Castellón", "Valencia") ~ "Comunidad Valenciana",
    Provincias %in% c("Badajoz", "Cáceres") ~ "Extremadura",
    Provincias %in% c("A Coruña", "Lugo", "Ourense", "Pontevedra") ~ "Galicia", 
    Provincias == "Madrid" ~ "Madrid",
    Provincias == "Murcia" ~ "Murcia",
    Provincias == "Navarra" ~ "Navarra",
    Provincias %in% c("Alava", "Gipuzkoa", "Vizcaya") ~ "País Vasco",
    Provincias == "La Rioja" ~ "La Rioja",
    Provincias == "Ceuta" ~ "Ceuta",
    Provincias == "Melilla" ~ "Melilla"
  )) %>% 
  filter(!grepl("^(Extranjero|Nacional|Total|Andalucía|Aragón|Canarias|Castilla y León|Castilla - La Mancha|Cataluña|Comunidad Valenciana|Extremadura|Galicia|País Vasco)"
                , Provincias))   
  • Renombrado de atributos
df_m<-rename(.data = df_m, Provincia = Provincias, Muertes = value, Año = Periodo)
2.2.3. Estructura final de los datos

3. Obtención de datos de la AEMET

Se recogen todas las estaciones de la aemet.

estaciones <- aemet_stations()

A continuación, se muestra la estructura de los datos:

Selección de los códigos de las estaciones meteorológicas de interés.

codigos <- c("C449C", "C658L", "0076", "0367", "1212E", "1387", "1484C", "1505", "1690A", "2030", "2331", "2422", "2465", "2614", "2870", "3129", "3013", "3260B", "4121", "4452", "4642E", "5000C", "5530E", "5783", "6000A", "7178I", "8025", "8096", "8178D", "8368U", "8414A", "9434", "9771C", "9898", "6325O", "9091O", "2444", "B278", "1082", "3469A", "5973", "1111", "8500A", "5402", "1014", "5270B", "9170", "6155A", "9263D", "0016A", "2661", "2235U")

Generación del dataframe Datos_metdonde se almacenarán los datos.

datos_met <- data.frame(matrix(ncol = 5))
colnames(datos_met) <- c('codigo', 'ta_max', 'ta_min', 'tm_mes', 'año')

Obtención de los datos de tempertatura máxima, mínima y media mesual durante los años 2003 a 2020 de todas las estaciones selecionadas.

A continuación, se muestra el código para acceder a dichos datos de la AEMET. Para una mayor rapidez de renderizado se importan los datos desde un archivo.

for (año in 2003:2020){
  print(año)
  for (i in codigos){
    print(i)
    met_prov <- as.data.frame(aemet_monthly_clim(i, year = año)) %>% 
      slice (1:12) %>% 
      select(c('ta_max', 'ta_min', 'tm_mes'))
    
    met_prov$ta_max <- sapply(met_prov$ta_max, FUN = function(x) as.numeric(unlist(strsplit(x, '\\('))[1]) )
    met_prov$ta_min <- sapply(met_prov$ta_min, FUN = function(x) as.numeric(unlist(strsplit(x, '\\('))[1]) )
    
    
    met_procesados <-  data.frame('codigo' = i,
                                  'ta_max' = max(met_prov$ta_max, na.rm = TRUE), 
                                  'ta_min' = min(met_prov$ta_min, na.rm = TRUE), 
                                  'tm_mes' = mean(met_prov$tm_mes, na.rm = TRUE),
                                  'año' = año)
    # print(met_procesados)
    datos_met <- rbind(datos_met, met_procesados)
    # print(datos_met)
    Sys.sleep(1.5)
  }
}
load('datos_aemet.RData')

Añadimos la provincia correspondiente a cada registro.

cod_estaciones <- estaciones %>% 
  select(indicativo,provincia) %>% 
  rename(codigo = indicativo)
datos_met <- merge(datos_met,cod_estaciones, by = 'codigo')

Estandarizamos los nombres de los atributos y de las provincias. Eliminamos el atributo ‘codigo’.

datos_met<-rename(.data = datos_met, Provincia = provincia, Año = año)
datos_met <- select(datos_met,-codigo)
datos_met$Año <- as.character(datos_met$Año)

datos_met$Provincia <- str_replace_all(datos_met$Provincia,"TARRAGONA","Tarragona") %>% 
  str_replace_all("BARCELONA", "Barcelona") %>% 
  str_replace_all("GIRONA", "Girona") %>% 
  str_replace_all("GIPUZKOA", "Gipuzkoa") %>% 
  str_replace_all("BIZKAIA", "Vizcaya") %>% 
  str_replace_all("CANTABRIA", 'Cantabria') %>% 
  str_replace_all('ASTURIAS','Asturias') %>% 
  str_replace_all("A CORUÑA", "A Coruña") %>% 
  str_replace_all("PONTEVEDRA", "Pontevedra") %>% 
  str_replace_all("LUGO", "Lugo") %>% 
  str_replace_all("OURENSE", "Ourense") %>% 
  str_replace_all("SORIA", "Soria") %>% 
  str_replace_all("PALENCIA", "Palencia") %>% 
  str_replace_all("BURGOS", "Burgos") %>% 
  str_replace_all("VALLADOLID", "Valladolid") %>% 
  str_replace_all("AVILA", "Avila") %>% 
  str_replace_all("SEGOVIA", "Segovia") %>% 
  str_replace_all("ZAMORA", "Zamora") %>% 
  str_replace_all("LEON", "León") %>%
  str_replace_all("SALAMANCA", "Salamanca") %>% 
  str_replace_all("GUADALAJARA", "Guadalajara") %>% 
  str_replace_all("MADRID", "Madrid") %>% 
  str_replace_all("TOLEDO", "Toledo") %>% 
  str_replace_all("CACERES", "Cáceres") %>% 
  str_replace_all("CIUDAD REAL", "Ciudad Real") %>% 
  str_replace_all("BADAJOZ", "Badajoz") %>% 
  str_replace_all("HUELVA", "Huelva") %>% 
  str_replace_all("CEUTA", "Ceuta") %>% 
  str_replace_all("JAEN", "Jaén") %>% 
  str_replace_all("CORDOBA", "Córdoba") %>% 
  str_replace_all("GRANADA", "Granada") %>% 
  str_replace_all("SEVILLA", "Sevilla") %>% 
  str_replace_all("CADIZ", "Cádiz") %>% 
  str_replace_all("MELILLA", "Melilla") %>% 
  str_replace_all("MALAGA", "Málaga") %>% 
  str_replace_all("ALMERIA", "Almería") %>% 
  str_replace_all("MURCIA", "Murcia") %>% 
  str_replace_all("ALICANTE", "Alicante") %>% 
  str_replace_all("CUENCA", "Cuenca") %>% 
  str_replace_all("ALBACETE", "Albacete") %>% 
  str_replace_all("TERUEL", "Teruel") %>% 
  str_replace_all("VALENCIA", "Valencia") %>% 
  str_replace_all("CASTELLON", "Castellón") %>% 
  str_replace_all("ARABA/ALAVA", "Alava") %>% 
  str_replace_all("LA RIOJA", "La Rioja") %>% 
  str_replace_all("NAVARRA", "Navarra") %>% 
  str_replace_all("ZARAGOZA", "Zaragoza") %>% 
  str_replace_all("LLEIDA", "Lleida") %>% 
  str_replace_all("HUESCA", "Huesca") %>% 
  str_replace_all("ILLES BALEARS", "Baleares") %>% 
  str_replace_all("STA. CRUZ DE TENERIFE", "Santa Cruz de Tenerife") %>% 
  str_replace_all("LAS PALMAS", "Las Palmas")

3.1.Estructura final de los datos

4. Obtención de datos de población

Para un mejor análisis de los resultados finales se obtienen las poblaciones anuales de cada provincia.

Poblacion <- read_delim("INPUT/DATA/Poblacion/Poblacion.csv", 
                        delim = ";",locale = locale(encoding = "ISO-8859-1"),  ,escape_double = FALSE, trim_ws = TRUE) %>% 
  select(!(Edad)) %>% 
  filter(grepl('enero', Periodo)) %>%  
  suppressMessages()

Inicialmente Población se estructura así:

4.1. Código para limpiar y estandarizar valores de atributos.

  • Provincias
Poblacion$Provincias <- str_replace_all(Poblacion$Provincias,"[0123456789]","") %>% 
  str_replace_all("^ ","") %>% 
  str_replace_all("Araba/Á","A") %>% 
  str_replace_all("/Alacant", '') %>% 
  str_replace_all('Ávila', 'Avila') %>% 
  str_replace_all('Balears, Illes', 'Baleares') %>% 
  str_replace_all("CANARIAS", 'Canarias') %>% 
  str_replace_all("CANTABRIA", 'Cantabria') %>% 
  str_replace_all("/Castelló", '') %>% 
  str_replace_all("Coruña, A", 'A Coruña') %>% 
  str_replace_all("Guipúzcoa", 'Gipuzkoa') %>% 
  str_replace_all('Murcia*', 'Murcia') %>% 
  str_replace_all("Palmas, Las", 'Las Palmas') %>%
  str_replace_all("Rioja, La", 'La Rioja') %>%
  str_replace_all("/València", '') %>% 
  str_replace_all("Bizkaia", 'Vizcaya')
  • Periodo
Poblacion$Periodo <- substr(Poblacion$Periodo,nchar(Poblacion$Periodo)-4,nchar(Poblacion$Periodo)) %>%as.integer()
  • Valores

Nos quedamos con la parte entera del valor referente a población y lo guardamos como número.

Poblacion$Total <- sapply(sapply(Poblacion$Total, strsplit, split = ','), function(x) x[1]) 

Poblacion$Total <- Poblacion$Total %>% 
  str_replace_all("\\.","") %>% 
  as.integer()
  • Renombrado
Poblacion <- rename(.data = Poblacion, Provincia = Provincias, Año = Periodo, Total_d = Total)
Poblacion$Año <- as.character(Poblacion$Año)

4.2. Estructura final de los datos

5. Obtención de Valores para el mapa de España y poder emplearlo en el shiny

provincias_sf <- esp_get_prov()  # Geometría de las provincias
can <- esp_get_can_box()  # Ajuste para Canarias

provincias_sf$ine.prov.name <- str_replace_all(provincias_sf$ine.prov.name,"[0123456789]","") %>% 
  str_replace_all("^ ","") %>% 
  str_replace_all("Araba/Á","A") %>% 
  str_replace_all("/Alacant", '') %>% 
  str_replace_all("ANDALUCÍA", 'Andalucía') %>% 
  str_replace_all('ARAGÓN', 'Aragón') %>% 
  str_replace_all('ASTURIAS','Asturias') %>% 
  str_replace_all('Asturias \\(Principado de\\)', 'Asturias') %>%
  str_replace_all('Asturias, Principado de', 'Asturias') %>%  
  str_replace_all('Asturias, PRINCIPADO DE', 'Asturias') %>%
  str_replace_all('Ávila', 'Avila') %>% 
  str_replace_all('BALEARS, ILLES', 'Baleares') %>% 
  str_replace_all('Balears, Illes', 'Baleares') %>% 
  str_replace_all('Balears \\(Illes\\)', 'Baleares') %>% 
  str_replace_all("CANARIAS", 'Canarias') %>% 
  str_replace_all("CANTABRIA", 'Cantabria') %>% 
  str_replace_all("Castellón de la Plana", 'Castellón') %>% 
  str_replace_all("/Castelló", '') %>% 
  str_replace_all("CASTILLA - LA MANCHA", 'Castilla - La Mancha') %>% 
  str_replace_all("CASTILLA Y LEÓN", 'Castilla y León') %>% 
  str_replace_all("CATALUÑA", 'Cataluña') %>% 
  str_replace_all("Comunitat Valenciana", 'Comunidad Valenciana') %>% 
  str_replace_all("COMUNITAT VALENCIANA", 'Comunidad Valenciana') %>% 
  str_replace_all("Coruña \\(A\\)", 'A Coruña') %>% #revisar el Coruña (A) no se ha modificado con esto
  str_replace_all("Coruña, A", 'A Coruña') %>% 
  str_replace_all("EXTREMADURA", 'Extremadura') %>% 
  str_replace_all("GALICIA", 'Galicia') %>% 
  str_replace_all("Guipúzcoa", 'Gipuzkoa') %>% 
  str_replace_all('MADRID, COMUNIDAD DE','Madrid') %>% #revisar al igual que asturias para que solo salga Madrid
  str_replace_all('Madrid, Comunidad de', 'Madrid') %>%
  str_replace_all('Madrid \\(Comunidad de\\)', 'Madrid') %>% 
  str_replace_all('MURCIA, REGIÓN DE','Murcia') %>% #revisar para que solo salga Murcia
  str_replace_all('Murcia \\(Región de\\)','Murcia') %>%
  str_replace_all('Murcia, Región de','Murcia') %>%
  str_replace_all('Murcia*', 'Murcia') %>% 
  str_replace_all('NAVARRA, COMUNIDAD FORAL DE','Navarra') %>% #revisar para que salga solo Navarra
  str_replace_all('Navarra \\(Comun. Foral de\\)', 'Navarra') %>%
  str_replace_all('Navarra, Comunidad Foral de', 'Navarra') %>% 
  str_replace_all('PAÍS VASCO', 'País Vasco') %>% 
  str_replace_all("Palmas \\(Las\\)", 'Las Palmas') %>% #revisar el Palmas (Las) no se ha modificado con esto
  str_replace_all("Palmas, Las", 'Las Palmas') %>%
  str_replace_all("Rioja \\(La\\)", 'La Rioja') %>% #revisar Rioja (La) no se ha modificado con esto
  str_replace_all("Rioja, La", 'La Rioja') %>%
  str_replace_all("RIOJA, LA", 'La Rioja') %>% 
  str_replace_all("TOTAL NACIONAL", 'Total') %>% 
  str_replace_all("Total Nacional", 'Total') %>% 
  str_replace_all("/València", '') %>% 
  str_replace_all("Bizkaia", 'Vizcaya')

provincias_sf <- rename(.data = provincias_sf, Provincia = ine.prov.name)

6. Fusión de datos en un único dataframe

Unión de datos de ingreso y muerte

df_combined <- left_join(x = df_i, y = df_m, by = c("Provincia", "Año", "Comunidad.Autonoma", "Sexo"))

Unión de todos los datos de diabetes (en df_combined) y datos meteorológicos.

df_combined <- left_join(x = df_combined, y = datos_met, by = c("Provincia", "Año"))

Unión de los datos de población

df_combined <- left_join(x= df_combined, y = Poblacion, by = c("Provincia", "Año", "Sexo"))
df_combined$Año <- as.integer(df_combined$Año)

Conversión de ingresos y muertes a valores por cada 100.000 habitantes

df_combined <- df_combined %>% 
  mutate(Diagnosticos = (Diagnosticos / Total_d)*100000 )

df_combined<- df_combined %>% 
  mutate(Muertes = (Muertes / Total_d)*100000)
provincias_sf <- provincias_sf %>%
  left_join(x= provincias_sf, y = df_combined, by = c("Provincia"))  # Asegúrate de que los nombres coincidan

provincias_sf <- provincias_sf %>% 
  filter(Año >= 2010)

Resultado final.

datatable(df_combined)

Gráficos y resultados

En la aplicación shiny además de estos dos primeros gráficos, encontraremos muchos más ejemplos.

Grafico de Diagnosticos (100.000 hab) por provincia y año (desde 2010)

datos_filtrados <- df_combined %>% 
  filter(Año >= 2010 & Sexo == "Ambos sexos")
p <- ggplot(datos_filtrados, aes_string(x = "Año", y = "Diagnosticos", color = "Comunidad.Autonoma",
                                        group = "Comunidad.Autonoma", text = "paste('Provincia:', Provincia)"
)) +
  geom_point() +
  geom_smooth(method = "lm", aes(color = Comunidad.Autonoma), se = FALSE ) +
  labs(title = paste("Diagnosticos", "(cada 100.000 hab) por año y provincia (Sexo:", "Ambos sexos", ")"),
       x = "Año", y = "Diagnosticos") +
  theme_minimal()

ggplotly(p)
print(p)

Grafico de Diagnosticos (100.000 hab) de cada provincia por año (desde 2010)

datos_filtrados_temp <- df_combined %>%
  filter(Sexo == "Ambos sexos" & !is.na(tm_mes) & Año >= 2010)

p2 <- ggplot(datos_filtrados_temp, aes_string(
  x = "tm_mes",
  y = "Diagnosticos",
  color = "Comunidad.Autonoma",
  text = "paste('Provincia:', Provincia, '<br>Año:', Año)"
)) +
  geom_point(alpha = 0.6) +
  geom_smooth(
    method = "lm", 
    se = TRUE, 
    aes_string(x = "tm_mes", y = "Diagnosticos"), 
    inherit.aes = FALSE, 
    color = "black"
  ) +
  labs(title = paste("Relación entre", "Diagnosticos", "y","tm_mes", "(cada 100.000 hab) (Sexo:", "Ambos sexos", ")"),
       x = "tm_mes", y = "Número de:Diagnosticos") +
  theme_minimal()

ggplotly(p2)
print(p2)

Aplicacion Shiny

En este apartado encontraremos las dos partes que conforman la aplicación shiny.

Interfaz de Usuario

En este apartado nos encontramos con la parte interactiva de la aplicación donde podremos elegir el gráfico que queremos mostrar. Hay un total de 4 opciones, 3 de ellas son gráficos de dispersión y un mapa de España. Para generar esta aplicación nos hemos basado en los principios básicos aprendidos en el tutorial introductorio de Shiny (Posit, n.d.). Para desarrollar una aplicación más compleja y visualmente atractiva, se utilizó la estructura de shinydashboard, que facilita la creación de interfaces de usuario avanzadas (RStudio, n.d.). También, se utilizó el libro “Mastering Shiny” de Wickham y Grolemund (Wickham and Grolemund 2024) como referencia. La representación visual de los mapas de España fue facilitada por el paquete mapSpain (Vázquez 2024).

En cada caso podremos selecionar diferentes variables a mostrar mediante una caja de opciones o una casilla de selección.

  • Primer gráfico: Podremos mostrar el sexo, diagnósticos de ingreso o muertes, si se deasea mostrar los datos desde el año 2010 y si se quieren mostrar o no los límites de intervalo de confianza.

  • Segundo gráfico: Podremos mostrar el sexo que queramos, diagnosticos de ingreso o muertes, la temperatura maxima, minima o media, si se deasea mostrar los datos desde el año 2010 y si se quieren mostrar o no los limites de intervalo de confianza.

  • Tercer gráfico: Podremos mostar la provincia en concreto que deseemos, la variable que queremos a lo largo de los años o temperaturas, diagnosticos o muertes, si se deasea mostrar los datos desde el año 2010 y si se quieren mostrar o no los limites de intervalo de confianza.

  • Mapa de España: En este mapa podremos seleccionar entre el sexo que queremos mostrar y el año que se desea mostrar, ademas de ser interactivo, donde se mostrara la temperatura media de la provincia y los casos.

library(shiny)
library(ggplot2)
library(plotly)

# Interfaz de usuario
ui <- fluidPage(
  titlePanel("Selecciona y visualiza gráficos"),
  sidebarLayout(
    sidebarPanel(
      selectInput("graph_choice", "Seleccione el gráfico a mostrar:",
                  choices = c("Casos/Muertes (100.000 hab) por año y provincia" = "grafico1",
                              "Temperatura vs número de casos/Muertes (100.000 hab)" = "grafico2",
                              "Casos/Muertes (100.000 hab) de una provincia en Concreto (En años y en temperaturas)" = "grafico3",
                              "Mapa de España Casos (100.000 hab) en un año" = "grafico4"
                  )),
      
      # Controles para el primer gráfico
      conditionalPanel(
        condition = "input.graph_choice == 'grafico1'",
        div(
          style = "width: 150px;",
          selectInput("sex", "Seleccione el sexo:", choices = NULL),
          selectInput("valor", "Seleccione el Diagnosticos/muertes:", choices = c("Diagnosticos", "Muertes")),
          checkboxInput("filtro_año", "Mostrar datos desde 2010", value = FALSE),
          checkboxInput("Limites", "Mostrar intervalo de confianza", value = FALSE)
        )
      ),
      
      # Controles para el segundo gráfico
      conditionalPanel(
        condition = "input.graph_choice == 'grafico2'",
        div(
          selectInput("temp_var", "Seleccione la variable de temperatura:",
                      choices = c("ta_max", "ta_min", "tm_mes")),
          selectInput("sex_temp", "Seleccione el sexo:", choices = NULL),
          selectInput("valor_temp", "Seleccione el Diagnosticos/muertes:", choices = c("Diagnosticos", "Muertes")),
          checkboxInput("filtro_año_temp", "Mostrar datos desde 2010", value = FALSE),
          checkboxInput("Limites_temp", "Mostrar intervalo de confianza", value = FALSE)
          
        )
      ),
      #Controles del tercer grafico
      conditionalPanel(
        condition = "input.graph_choice == 'grafico3'",
        div(
          style = "width: 150px;",
          selectInput("provincia_1", "Seleccione la provincia:", choices = NULL),
          selectInput("selecion_1", "Seleccione la variable del eje de las X (Años, o temperaturas):",
                      choices = c("Año","ta_max", "ta_min", "tm_mes")),
          selectInput("sex_1", "Seleccione el sexo:", choices = NULL),
          selectInput("valor_1", "Seleccione el Diagnosticos/muertes:", choices = c("Diagnosticos", "Muertes")),
          checkboxInput("filtro_año_1", "Mostrar datos desde 2010", value = FALSE),
          checkboxInput("Limites_1", "Mostrar intervalo de confianza", value = FALSE)
          
        )
      ),
      #Controles del mapa de España
      conditionalPanel(
        condition = "input.graph_choice == 'grafico4'",
        div(
          selectInput("sex_map", "Seleccione el sexo:", choices = NULL),
          selectInput("año_map", "Selecione el año a mostrar", choices = NULL)
          
          
        )
      ),
    ),
    
    mainPanel(
      conditionalPanel(
        condition = "input.graph_choice == 'grafico1'",
        plotlyOutput("scatterPlot1", width = "100%", height = "700px")
      ),
      conditionalPanel(
        condition = "input.graph_choice == 'grafico2'",
        plotlyOutput("scatterPlot2", width = "100%", height = "700px")
      ),
      conditionalPanel(
        condition = "input.graph_choice == 'grafico3'",
        plotlyOutput("scatterPlot3", width = "100%", height = "700px")
      ),
      conditionalPanel(
        condition = "input.graph_choice == 'grafico4'",
        plotlyOutput("scatterPlot4", width = "100%", height = "700px")
      )
    )
  )
)

Servidor

En esta otra sección nos encontramos con la parte que se ejecuta para poder mostrar los gráficos finales.

En este apartado, se rellenan las selecciones de la interfaz gráfica, como el sexo, las provincias, años.

Igualmente, dependiendo de lo que seleccionemos para mostrar en la interfaz, se ejecutará una gráfica u otra.

En todos los graficos primeramente filtraremos los datos a los seleccionados por el usuario para poder mostrarlo. Posteriormente, pasaremos a mostrar los diferentes gráficos según la selección tomada. Y por último, se convertirán en gráficos interactivos, para una mejor visualización donde poder consultar los valores que toman y poder seleecionar y deseleccionar diversas opciones.

server <- function(input, output, session) {
  # Actualiza las opciones de sexo basadas en los datos cargados
  observe({
    updateSelectInput(session, "sex", choices = unique(df_combined$Sexo))
    updateSelectInput(session, "sex_temp", choices = unique(df_combined$Sexo))
    updateSelectInput(session, "sex_1", choices = unique(df_combined$Sexo))
    updateSelectInput(session, "provincia_1", choices = unique(df_combined$Provincia))
    updateSelectInput(session, "sex_map", choices = unique(provincias_sf$Sexo))
    updateSelectInput(session, "año_map", choices = unique(provincias_sf$Año))
  })
  
  # Renderiza el primer gráfico de dispersión
  output$scatterPlot1 <- renderPlotly({
    req(input$graph_choice == "grafico1")
    
    datos_filtrados <- df_combined %>%
      filter(Sexo == input$sex)
    
    if (input$filtro_año) {
      datos_filtrados <- datos_filtrados %>% 
        filter(Año >= 2010)
    } 
    
    
    p <- ggplot(datos_filtrados, aes_string(x = "Año", y = input$valor, color = "Comunidad.Autonoma",
                                            group = "Comunidad.Autonoma", text = "paste('Provincia:', Provincia)"
    )) +
      geom_point() +
      geom_smooth(method = "lm", aes(color = Comunidad.Autonoma), se = input$Limites ) +
      labs(title = paste(input$valor, "(cada 100.000 hab) por año y provincia (Sexo:", input$sex, ")"),
           x = "Año", y = input$valor) +
      theme_minimal()
    
    ggplotly(p)
  })
  
  # Renderiza el segundo gráfico de dispersión
  output$scatterPlot2 <- renderPlotly({
    req(input$graph_choice == "grafico2")
    
    datos_filtrados_temp <- df_combined %>%
      filter(Sexo == input$sex_temp)
    
    if (input$filtro_año_temp) {
      datos_filtrados_temp <- datos_filtrados_temp %>% 
        filter(Año >= 2010)
    }
    
    p2 <- ggplot(datos_filtrados_temp, aes_string(
      x = input$temp_var,
      y = input$valor_temp,
      color = "Comunidad.Autonoma",
      text = "paste('Provincia:', Provincia, '<br>Año:', Año)"
    )) +
      geom_point(alpha = 0.6) +
      geom_smooth(
        method = "lm", 
        se = input$Limites_temp, 
        aes_string(x = input$temp_var, y = input$valor_temp), 
        inherit.aes = FALSE, 
        color = "black"
      ) +
      labs(title = paste("Relación entre", input$temp_var, "y",input$valor_temp, "(cada 100.000 hab) (Sexo:", input$sex, ")"),
           x = input$temp_var, y = input$valor_temp) +
      theme_minimal()
    
    ggplotly(p2)
  })
  output$scatterPlot3 <- renderPlotly({
    req(input$graph_choice == "grafico3")
    
    datos_filtrados_prov <- df_combined %>%
      filter(Sexo == input$sex_1 & Provincia == input$provincia_1)
    
    if (input$filtro_año_1) {
      datos_filtrados_prov<- datos_filtrados_prov %>% 
        filter(Año >= 2010)
    }
    
    p3 <- ggplot(datos_filtrados_prov, aes_string(x = input$selecion_1, 
                                                  y = input$valor_1, 
                                                  color = "Comunidad.Autonoma",
                                                  text = "paste('Provincia:', Provincia)"
    )) +
      geom_point()+
      geom_smooth(method = "lm", aes(color = input$provincia_1), se = input$Limites_1 )+
      labs(title = paste(input$valor_1, "(cada 100.000 hab) por", input$selecion_1, "y provincia",input$provincia_1, "(Sexo:", input$sex_1, ")"),
           x = input$selecion_1, y = input$valor_1) +
      theme_minimal()
    
    ggplotly(p3)
  })
  output$scatterPlot4 <- renderPlotly({
    req(input$graph_choice == "grafico4")
    
    datos_filtrados_map <- provincias_sf %>% 
      filter(Año == input$año_map & !is.na(ta_max) & Sexo == input$sex_map)
    
    interactive_map <- ggplot(datos_filtrados_map) +
      geom_sf(aes(fill = Diagnosticos, text = paste0(
        "Provincia: ", Provincia, "<br>",
        "Diagnósticos: ", Diagnosticos, "<br>",
        "Temp. Media: ", round(tm_mes, 1)
      )), color = "grey70", linewidth = 0.3) +  # Incluye información adicional en el hover
      geom_sf(data = can, color = "grey70") +  # Ajustar Canarias
      scale_fill_gradientn(
        colors = hcl.colors(10, "Reds", rev = TRUE),  # Escala de colores para diagnósticos
        n.breaks = 10,
        guide = guide_colorbar(title = "Diagnósticos")
      ) +
      labs(title = "Diagnósticos por provincia y temperatura media",
           fill = "Diagnósticos") +
      theme_void() +
      theme(legend.position = "right")
    
    # Usa plotly para interactividad
    ggplotly(interactive_map, tooltip = "text")
    
  })
}

Como se observará, en algunos de los gráficos emplea aes_string.Esto se debe a cómo está formulada la selección de opciones en la interfaz, de ahí la razon por la que exista algunos graficos con aes y otros con aes_string.

En lugar de emplear aes_string se podría emplear (!!sym), otra forma de implementar las variables mucho más moderna, pero pareció una forma de complicar las cosas. Se tendría que tomar esto en cuenta, ya que en algunas de las ejecuciones se mostraba que aes_string es una forma poco moderna.

Conclusiones

Los resultados de este estudio no han permitido identificar una relación clara y directa entre las variables climáticas analizadas (temperatura máxima, mínima y media) y las tasas de hospitalizaciones y muertes por diabetes. Aunque se observaron ciertas tendencias, estas no fueron consistentes ni suficientemente robustas para establecer correlaciones significativas. Este hallazgo destaca la complejidad de los factores que influyen en las hospitalizaciones por diabetes y la necesidad de estudios adicionales con datos más homogéneos y detallados.

Además, cabe señalar que a partir del año 2010, el Instituto Nacional de Estadística (Instituto Nacional de Estadística (INE) 2024)implementó un cambio en los criterios de obtención de datos sobre hospitalizaciones, lo que complicó el análisis longitudinal y la comparación de datos previos y posteriores a este cambio. Esta limitación metodológica subraya la importancia de contar con datos consistentes y estandarizados para futuras investigaciones.

En cuanto a los objetivos específicos: - Respecto al análisis de la relación entre las variables climáticas y las tasas de hospitalización y mortalidad, no se encontraron patrones significativos que respalden una asociación directa. - Las correlaciones exploradas entre las variaciones climáticas y las tasas de hospitalización tampoco mostraron una fuerza o dirección clara. - Finalmente, no se identificaron diferencias significativas en el impacto de las condiciones climáticas sobre las hospitalizaciones por diabetes entre distintas regiones geográficas.

Estos resultados subrayan la necesidad de continuar explorando esta problemática desde una perspectiva interdisciplinaria, incorporando bases de datos más amplias y métodos de análisis que permitan capturar con mayor precisión las dinámicas entre el clima y la salud.

Bibliografía

Emet, Clima. 2024. “Climaemet: Interface to Download and Visualize Meteorological Data from the Spanish National Meteorological Agency (AEMET).” https://cran.r-project.org/web/packages/climaemet/index.html.
Instituto Nacional de Estadística (INE). 2024. “Datos Climáticos y de Salud.” https://www.ine.es/.
Moon, J. 2021. “The Effect of the Heatwave on the Morbidity and Mortality of Diabetes Patients; a Meta-Analysis for the Era of the Climate Crisis.” Environmental Research 195: 110762. https://doi.org/10.1016/j.envres.2021.110762.
Posit. n.d. “Shiny Basics - Introduction to Shiny.” https://shiny.posit.co/r/getstarted/shiny-basics/lesson1/.
Preston, E. V., C. Eberle, F. M. Brown, and T. James-Todd. 2020. “Climate Factors and Gestational Diabetes Mellitus Risk - a Systematic Review.” Environmental Health: A Global Access Science Source 19 (1): 112. https://doi.org/10.1186/s12940-020-00668-w.
RStudio. n.d. “Shinydashboard.” https://rstudio.github.io/shinydashboard/index.html.
Vázquez, Fernando. 2024. “mapSpain: Maps of Spain and Its Autonomous Communities.” https://cran.r-project.org/web/packages/mapSpain/index.html.
Wickham, Hadley, and Garrett Grolemund. 2024. Mastering Shiny. https://mastering-shiny.org/; O’Reilly Media.